SQLServer アーキテクチャ メモリ管理
#SQLServer
概要
SQL Serverは様々な用途でメモリを利用してる。
ディスクI/Oを削減するためのデータバッファ、結果セットの並べ替えを行うための領域、コンパイル済みのクエリ実行プランを格納する場所などなど
前提
OSにおける各プロセスは仮想メモリ空間を保持している。
基本的に、プロセス全ての仮想メモリを物理メモリに展開してるわけではない。そんなことをするとメモリがすぐにパンクする。
OSはプロセスごとの仮想メモリを管理して、必要に応じて物理メモリやページファイルを適用する。
OSのカーネルプロセスもメモリ空間を利用してることも忘れない。
つまり、32GBのメモリを搭載してるとしたら、そのうちのいくつかの領域はカーネルが占有してる。
残りをユーザープロセスが使える形になる。
メモリの確保方法
SQL Serverでは起動時に必要最低限のメモリ領域だけ物理領域確保(Committed)する。
そのほかのReservedは、必要になったタイミングでCommittedする。
他プロセスとの共同
ページングへの対処
OSではメモリ領域が足りなくなったら、ディスクの一部をメモリとして利用し始める。
メモリからディスクにデータが移されることをページングと呼ぶ。
SQL Serverのデータがページングされちゃうと、性能的に大変なので、制御する必要はある。
「SQL Serverのメモリはページングの対象にさせない」と言う特権もあるので覚えておくといい。
「max server memory」でSQL Serverが使用するメモリ量を制限できる
この設定値によってSQL Serverの最大メモリ使用量を決定できる。
例えば、SQL Serverが無尽蔵にメモリを使って、他プロセスに迷惑をかけないようにしたりしてる。
バッファプールのサイズを決めてるのではなく、SQL Server全体のメモリ使用量を決めてることに注意されよ。
SQL Server自身のメモリ管理方法
ワークスペース
SQL Serverではワークスペースと呼ばれる、各タスクの作業場所となる領域がある。
内部構造
Fixed Size Block Allocatorと呼ばれる、決められたサイズのブロック(8, 16, 32, 128KB)を保持するコンポーネントが存在。
獲得要求があったサイズ量に合わせて、適切なサイズのFixed Size Block Allocatorのブロックが割り当てられる。
https://scrapbox.io/files/63e12809ba35d4001eada9f5.png
メモリマネージャ
この領域を必要なメンバーにいい感じに配分する役割を担ってる。
タスクからメモリ獲得要求を受け取ると、ワークスペースの一部を割り当てる。
メモリの用途
バッファプール
データページやインデックスページを保管するキャッシュ。
ヒット率が高いとIO数も減って性能向上につながるだろう。
プランキャッシュ
コンパイルした実行計画を格納しておく場所。
同じクエリがあった場合、コンパイル時間を短縮できる。
クエリワークスペース
クエリ結果の並べ替えなどに利用される。
その他
レプリケーション用、ロック用、クエリテキスト格納用などなど
俺的ポイント
max server memoryによって、SQL Serverが利用できるメモリ量の最大値を決めれることを知っておく
SQLServer アーキテクチャ メモリ管理#63e1253ab3641f0000595342
SQL Serverはメモリが必要になるまでは、Committedしない。つまり物理メモリを食わない
SQLServer アーキテクチャ メモリ管理#63e12352b3641f0000595336
なので、SQL Serverを新しく起動した最初の段階では、SQL Serverのメモリ使用量が小さい状態になってる。
運用される中でバッファプールにデータが保存され出してから、徐々にメモリ使用量が増えていく。
そして、最終的にはサーバーのメモリ最大値もしくはmax server memoryの設定値までメモリを食うことになる。